package com.triones.api.service.third;

import com.triones.api.entity.interlace.bo.request.*;

import java.util.List;
import java.util.Map;

/**
 * interlace crypto 接口（调用第三方）
 */
public interface InterlaceService {

    /**
     * 获取代码
     */
    Map oauthAuthorize();

    /**
     * 生成访问令牌
     */
    void oauthAccessToken();

    /**
     * 刷新访问令牌
     */
    void oauthRefreshToken();

    /**
     * 获取AccessToken
     */
    String getAccessToken();

    /**
     * 创建interlace账号
     */
    Map accountsRegister(AccountsRegisterRequest request);

    /**
     * 查询crypto钱包列表
     */
    Map cryptoconnectWallets(CryptoconnectWalletsRequest request);

    /**
     * 创建区块链地址
     */
    Map cryptoconnectWalletsAddresses(CryptoconnectWalletsAddressesRequest request, String walletId);

    /**
     * 获取转账手续费及跨链额度
     */
    Map transfersFeeAndQuota(TransfersFeeAndQuotaRequest request);

    /**
     * 创建转移
     */
    Map transfers(TransfersRequest request);

    /**
     * 触发回调
     */
    Map triggerWebhook(TriggerWebhookRequest request);

    /**
     * 估价询价
     */
    Map estimateQuote(EstimateQuoteRequest request);

    /**
     * 文件上传
     */
    String uploadFile(UploadFileRequest request);

    /**
     * 子账户kyc
     */
    String kyc(KycRequest request,String accountId);

    /**
     * 初始化账号
     */
    Boolean initialization(String accountId);

    /**
     * 获取一个钱包
     */
    Map getWallet(String walletId);

    /**
     * 内部转移
     */
    Map internalTransferCrypto(InternalTransferRequest request);

    /**
     * 创建持卡人
     */
    String createCardholder(CreateCardholderRequest request,String accountId);

    /**
     * 获取卡重要信息
     */
    Map infinityCardDetails(String cardId);

    /**
     * 可用的card bin
     */
    List<Map> availableCardBINs();

    /**
     * 获取Balances列表
     */
    Map listAllBalances(ListAllBalancesRequest request);

    /**
     * 换汇
     */
    Map convertTrades(ConvertTradesRequest request);

    /**
     * 子量子账户向子换汇账户转移
     */
    Map quantumSubAccountToCryptoAssets(QuantumSubAccountToCryptoAssetsRequest request);

    /**
     * 子换汇账户向子量子账户转移
     */
    Map cryptoAssetsToQuantumSubAccount(CryptoAssetsToQuantumSubAccountRequest request);

    /**
     * 获得一次转移
     */
    Map getOnceTransfer(String id);

    /**
     * 创建预算
     */
    String createBudget(CreateBudgetRequest request);

    /**
     * 获取所有预算组
     */
    Map listAllBudgets(ListAllBudgetsRequest request);

    /**
     * 创建预付卡
     */
    Boolean createInfinityCardToPrepaid(CreateInfinityCardToPrepaidRequest request);

    /**
     * 创建预算卡
     */
    Boolean createInfinityCardToBudget(CreateInfinityCardToBudgetRequest request);

    /**
     * 获取实体卡费用
     */
    List<Map> physicalCardFees(PhysicalCardFeesRequest request);

    /**
     * 批量发货实体卡
     */
    Boolean bulkShipPhysicalCards(BulkShipPhysicalCardsRequest request);

    /**
     * 获取卡信息
     */
    Map getCard(GetCardRequest request,String cardId);

    /**
     * 量子钱包->预付卡
     */
    Boolean infinityCardTransferIn(InfinityCardTransferRequest request);

    /**
     * 预付卡->量子钱包
     */
    Boolean infinityCardTransferOut(InfinityCardTransferRequest request);

    /**
     * 增加预算
     */
    Boolean increaseTheBudgetBalance(BudgetChangeRequest request);

    /**
     * 减少预算
     */
    Boolean decreaseTheBudgetBalance(BudgetChangeRequest request);

    /**
     * 冻结卡
     */
    Boolean unfreezeInfinityCard(FreezeInfinityCardRequest request);

    /**
     * 解冻卡
     */
    Boolean freezeInfinityCard(FreezeInfinityCardRequest request);

    /**
     * 子量子账户->主量子账户
     */
    Map subAccountToMasterAccount(SubAccountToMasterAccountRequest request);

    /**
     * 主量子账户->子量子账户
     */
    Map masterAccountToSubAccount(MasterAccountToSubAccountRequest request);

    /**
     * 初始主账户钱包信息
     */
    void initMasterAccountWallet();

    /**
     * 初始化主账户余额信息
     */
    void initMasterBalance();

    /**
     * 换汇账户转到主量子账户
     * @param request
     * @return
     */
    Map cryptoToMasterQuantum(CryptoToMasterQuantumRequest request);

    /**
     * 删除卡片
     */
    Boolean deleteCard(DeleteCardRequest request);

    /**
     * 速度控制
     */
    Boolean velocityControl(VelocityControlRequest request);
}
